package com.wande.dataplatform.filecollection.common.utils;

import cn.hutool.core.util.StrUtil;
import com.wande.dataplatform.filecollection.common.constant.FileCollectionConstants;

import java.util.HashMap;
import java.util.Map;

/**
 * 文件类型工具类
 *
 * @author wande
 */
public class FileTypeUtils {

    /**
     * 文件扩展名与文件类型映射
     */
    private static final Map<String, String> EXTENSION_TYPE_MAP = new HashMap<>();

    static {
        // 结构化文件
        EXTENSION_TYPE_MAP.put("csv", FileCollectionConstants.FileType.CSV);
        EXTENSION_TYPE_MAP.put("xls", FileCollectionConstants.FileType.XLS);
        EXTENSION_TYPE_MAP.put("xlsx", FileCollectionConstants.FileType.XLSX);
        EXTENSION_TYPE_MAP.put("xml", FileCollectionConstants.FileType.XML);
        EXTENSION_TYPE_MAP.put("json", FileCollectionConstants.FileType.JSON);
        EXTENSION_TYPE_MAP.put("sql", FileCollectionConstants.FileType.SQL);
        EXTENSION_TYPE_MAP.put("accdb", FileCollectionConstants.FileType.ACCDB);
        EXTENSION_TYPE_MAP.put("mdb", FileCollectionConstants.FileType.ACCDB);

        // 非结构化文件
        EXTENSION_TYPE_MAP.put("pdf", FileCollectionConstants.FileType.PDF);
        EXTENSION_TYPE_MAP.put("doc", FileCollectionConstants.FileType.DOC);
        EXTENSION_TYPE_MAP.put("docx", FileCollectionConstants.FileType.DOCX);
        EXTENSION_TYPE_MAP.put("txt", FileCollectionConstants.FileType.TXT);
    }

    /**
     * 根据文件名获取文件类型
     *
     * @param fileName 文件名
     * @return 文件类型
     */
    public static String getFileType(String fileName) {
        if (StrUtil.isBlank(fileName)) {
            return null;
        }

        String extension = getFileExtension(fileName);
        return EXTENSION_TYPE_MAP.get(extension.toLowerCase());
    }

    /**
     * 获取文件扩展名
     *
     * @param fileName 文件名
     * @return 扩展名（不含点号）
     */
    public static String getFileExtension(String fileName) {
        if (StrUtil.isBlank(fileName)) {
            return "";
        }

        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex == -1 || lastDotIndex == fileName.length() - 1) {
            return "";
        }

        return fileName.substring(lastDotIndex + 1);
    }

    /**
     * 判断是否为结构化文件
     *
     * @param fileType 文件类型
     * @return true-结构化文件，false-非结构化文件
     */
    public static boolean isStructuredFile(String fileType) {
        if (StrUtil.isBlank(fileType)) {
            return false;
        }

        return FileCollectionConstants.FileType.CSV.equals(fileType)
            || FileCollectionConstants.FileType.XLS.equals(fileType)
            || FileCollectionConstants.FileType.XLSX.equals(fileType)
            || FileCollectionConstants.FileType.XML.equals(fileType)
            || FileCollectionConstants.FileType.JSON.equals(fileType)
            || FileCollectionConstants.FileType.SQL.equals(fileType)
            || FileCollectionConstants.FileType.ACCDB.equals(fileType);
    }

    /**
     * 判断文件类型是否支持
     *
     * @param fileType 文件类型
     * @return true-支持，false-不支持
     */
    public static boolean isSupportedFileType(String fileType) {
        return EXTENSION_TYPE_MAP.containsValue(fileType);
    }

    /**
     * 验证文件类型是否在允许的类型列表中
     *
     * @param fileType      文件类型
     * @param allowedTypes  允许的类型列表（逗号分隔）
     * @return true-允许，false-不允许
     */
    public static boolean isAllowedFileType(String fileType, String allowedTypes) {
        if (StrUtil.isBlank(fileType) || StrUtil.isBlank(allowedTypes)) {
            return false;
        }

        String[] types = allowedTypes.split(",");
        for (String type : types) {
            if (type.trim().equalsIgnoreCase(fileType)) {
                return true;
            }
        }
        return false;
    }
}
